home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / charpal / charpal.asm next >
Assembly Source File  |  1995-02-07  |  17KB  |  826 lines

  1. ; charpal.asm    1994.11.18
  2.     ;    CHARacter PALlet
  3.     ; Towns のアナログパレット
  4.     ; を操作して、DOS モード
  5.     ; (R50互換表示画面モード)
  6.     ; での文字色,背景色を変更
  7.         .186
  8. ; 1994/11/18 ver 1.0 初版
  9. ; 1994/11/18 ver 1.1 レイア0/1優先順位入替え
  10. ; 1994/11/23 ver 1.3 Nifty:FOAU2 DL公開版 背景拡大機能追加
  11. ; 1995/01/06 ver 1.4 31KHzモード追加
  12. ; 1995/02/06 ver 1.5 フリコレ10 応募版(C L オプション追加)
  13.  
  14. cgroup        group    _TEXT,_DATA,_BSS
  15.  
  16. _TEXT        segment    byte public 'CODE'
  17.     ; コードセグメント
  18.         assume    cs:cgroup,ds:cgroup
  19.         org    0100h
  20. _TEXT        ends
  21.  
  22. _DATA        segment    word public 'CODE'
  23.     ; メッセージ、変数セグメント
  24.         assume    cs:cgroup,ds:cgroup
  25. _DATA        ends
  26.  
  27. _BSS        segment    word public 'CODE'
  28.     ; 未初期化領域セグメント
  29.         assume    cs:cgroup,ds:cgroup
  30. work_buff    db    ?
  31. _BSS        ends
  32.  
  33.     ; キャリッジリタン定義
  34. cr        equ    13
  35.     ; ラインフィード定義
  36. lf        equ    10
  37.     ; エンドオブストリング定義
  38. eos        equ    '$'
  39.     ; エスケープ
  40. esca        equ    1bh
  41.  
  42.     ; I/O アドレス
  43.  
  44.     ; アナログ
  45.     ; CRTCアドレス
  46. CRTC_ADR_REG    equ    00440h
  47.     ; CRTCデータ
  48. CRTC_DAT_REG    equ    00442h
  49. HDS1        equ    11
  50. HDE1        equ    12
  51. VDS1        equ    15
  52. VDE1        equ    16
  53. FA1        equ    21
  54.     ; パレットコードレジスタ
  55. PLT_COD_REG    equ    0fd90h
  56.     ; 青色パレットレジスタ
  57. ;PLT_BLU_REG    equ    0fd92h
  58.     ; 赤色パレットレジスタ
  59. ;PLT_RED_REG    equ    0fd94h
  60.     ; 緑色パレットレジスタ
  61. ;PLT_GRN_REG    equ    0fd96h
  62.     ; ビデオ出力I/O制御
  63.     ; アドレスレジスタ
  64. V_IO_AD_REG    equ    00448h
  65.     ; ビデオ出力I/O制御
  66.     ; データレジスタ
  67. V_IO_DA_REG    equ    0044Ah
  68.     ; コントロール
  69.     ; レジスタ番号
  70. ;CTRL_REG    equ    00b    ; 未使用
  71.     ; プライオリティ
  72.     ; レジスタ番号
  73. PRIO_REG    equ    01b
  74.     ; レイア0用(背景)
  75.     ; 16色パレット選択
  76.     ; YS無効
  77.     ; レイア0 前面
  78. PLT0_SEL    equ    00001000b
  79.     ; レイア1用(文字)
  80.     ; 16色パレット選択
  81.     ; YS無効
  82.     ; レイア0 前面
  83. PLT1_SEL    equ    00101000b
  84.  
  85. _DATA        segment    word public 'CODE'
  86.     ; オプション存在フラグ
  87. option        dw    0
  88. Doption        dw    0
  89.     ; 起動メッセージ
  90. c_mes        db    'Character Palette ver.1.5 (c)1994. Boko.' 
  91.         db    cr,lf
  92.         db    esca,'[0m'
  93.         db    ' 0'
  94.         db    esca,'[30m'
  95.         db    '  '
  96.         db    esca,'[0m'
  97.         db    '  1'
  98.         db    esca,'[34m'
  99.         db    '■'
  100.         db    esca,'[0m'
  101.         db    '  2'
  102.         db    esca,'[31m'
  103.         db    '■'
  104.         db    esca,'[0m'
  105.         db    '  3'
  106.         db    esca,'[35m'
  107.         db    '■'
  108.         db    esca,'[0m'
  109.         db    '  4'
  110.         db    esca,'[32m'
  111.         db    '■'
  112.         db    esca,'[0m'
  113.         db    '  5'
  114.         db    esca,'[36m'
  115.         db    '■'
  116.         db    esca,'[0m'
  117.         db    '  6'
  118.         db    esca,'[33m'
  119.         db    '■'
  120.         db    esca,'[0m'
  121.         db    '  7'
  122.         db    esca,'[37m'
  123.         db    '■'
  124.         db    esca,'[0m'
  125.         db    '  8'
  126.         db    esca,'[30;1m'
  127.         db    '■'
  128.         db    esca,'[0m'
  129.         db    '  9'
  130.         db    esca,'[34;1m'
  131.         db    '■'
  132.         db    esca,'[0m'
  133.         db    '  A'
  134.         db    esca,'[31;1m'
  135.         db    '■'
  136.         db    esca,'[0m'
  137.         db    '  B'
  138.         db    esca,'[35;1m'
  139.         db    '■'
  140.         db    esca,'[0m'
  141.         db    '  C'
  142.         db    esca,'[32;1m'
  143.         db    '■'
  144.         db    esca,'[0m'
  145.         db    '  D'
  146.         db    esca,'[36;1m'
  147.         db    '■'
  148.         db    esca,'[0m'
  149.         db    '  E'
  150.         db    esca,'[33;1m'
  151.         db    '■'
  152.         db    esca,'[0m'
  153.         db    '  F'
  154.         db    esca,'[37;1m'
  155.         db    '■'
  156.         db    esca,'[0m'
  157.         db    '$'
  158.         db    1Ah
  159.         db    eos
  160.  
  161. help_mes    db    cr,lf
  162.         db    cr,lf
  163.         db    'CHARPAL.COM は画面の文字色/背景色を変える'
  164.         db    'プログラムです。FM Townsシリーズ専用です。',cr,lf
  165.         db    '使用法:charpal [<カラーセット名>] [Dn][Ln][Cxxxx[Cxxxx・・・]]',cr,lf
  166.         db    cr,lf
  167.         db    'charpal INIT',09h,':文字色/背景色を初期状態に戻します',cr,lf
  168.         db    09H,'MONO',09h,':白地に黒文字。モノクロ8階調',cr,lf
  169.         db    09H,'NEGA',09h,':白地に黒文字。標準状態のネガ',cr,lf
  170.         db    09H,'PASTEL',09h,':緑地に白文字。黒板とチョークの文字風',cr,lf
  171.         db    09H,'GREEN',09h,':緑単色。グリーンディスプレイ風',cr,lf
  172.         db    09H,'PLASMA',09h,':オレンジ色単色。プラズマディスプレイ風',cr,lf
  173.         db    09H,'TROPICAL:青地に白文字。FM-OASYS風',cr,lf
  174.         db    cr,lf
  175.         db    09h,'D0',09h,':背景の広さを元にもどす',cr,lf
  176.         db    09h,'D1',09h,':背景を広くする(24KHz) グレーTownsのデフォルト',cr,lf
  177.         db    09h,'D2',09h,':背景を広くする(31KHz) 白いTownsのデフォルト',cr,lf
  178.         db    09h,'L0',09h,':画面の上下の線を消す',cr,lf
  179.         db    09h,'L1',09h,':画面の上下に線を描く',cr,lf
  180.         db    09h,'CpBRG',09h,':色の設定を詳細にできます。',cr,lf
  181.         db    09h,09h,'パレット番号,青の輝度,赤の輝度,緑の輝度'
  182.         db    ' を16進数で指定します。',cr,lf
  183.         db    09h,09h,'ex. C00FFC70F0(背景:黄色、文字:赤)'
  184.         db    eos
  185.  
  186.     ; CRTC コントロールデータ
  187.     ; その0 24KHz 画面
  188.     ; R50互換モードのデフォルト値
  189. CRT_DATA_0    dw    00040H    ; 00 HSW1 水平同期幅1
  190.         dw    00320H    ; 01 HSW2 水平同期幅2
  191.         dw    00000H    ; 02 dummy
  192.         dw    00000H    ; 03 dummy
  193.         dw    0035FH    ; 04 HST  水平同期周期
  194.         dw    00000H    ; 05 VST1 垂直同期時間1
  195.         dw    00010H    ; 06 VST2 垂直同期時間2
  196.         dw    00000H    ; 07 EET  等化パルス有効時間
  197.         dw    0036FH    ; 08 VST  垂直同期周期
  198.         dw    0009CH    ; 09 HDS0 水平表示開始0
  199.         dw    0031CH    ; 0A HDE0 水平表示終了0
  200.         dw    0009CH    ; 0B HDS1 水平表示開始1
  201.         dw    0031CH    ; 0C HDE1 水平表示終了1
  202.         dw    00040H    ; 0D VDS0 垂直表示開始0
  203.         dw    00360H    ; 0E VDE0 垂直表示終了0
  204.         dw    00040H    ; 0F VDS1 垂直表示開始1
  205.         dw    00360H    ; 10 VDE1 垂直表示終了1
  206.         dw    00000H    ; 11 FA0  フレーム先頭0
  207.         dw    0009CH    ; 12 HAJ0 水平アジャスト0
  208.         dw    00000H    ; 13 FO0  フィールド間オフセット0
  209.         dw    00050H    ; 14 LO0  ライン間オフセット0
  210.         dw    00000H    ; 15 FA1  フレーム先頭1
  211.         dw    0009CH    ; 16 HAJ1 水平アジャスト1
  212.         dw    00000H    ; 17 FO1  フィールド間オフセット1
  213.         dw    00080H    ; 18 LO1  ライン間オフセット1
  214.         dw    0004AH    ; 19 EHAJ 外部同期水平ADJ
  215.         dw    00001H    ; 1A EVAJ 外部同期垂直ADJ
  216.         dw    00000H    ; 1B ZOOM 水平垂直拡大
  217.         dw    0801FH    ; 1C CR0  コントロール0
  218.         dw    00003H    ; 1D CR1  コントロール1
  219.         dw    00000H    ; 1E FR   ダミーレジスタ
  220.         dw    00150H    ; 1F CR2  コントロール2
  221.  
  222.     ; CRTC コントロールデータ
  223.     ; その1 24KHz 画面
  224.     ; 上下左右に約1文字分ずつ
  225.     ; 画面表示領域を広げる
  226. CRT_DATA_1    dw    00040H    ; 00 HSW1 水平同期幅1
  227.         dw    00320H    ; 01 HSW2 水平同期幅2
  228.         dw    00000H    ; 02 dummy
  229.         dw    00000H    ; 03 dummy
  230.         dw    0035FH    ; 04 HST  水平同期周期
  231.         dw    00000H    ; 05 VST1 垂直同期時間1
  232.         dw    00010H    ; 06 VST2 垂直同期時間2
  233.         dw    00000H    ; 07 EET  等化パルス有効時間
  234.         dw    0036FH    ; 08 VST  垂直同期周期
  235.         dw    0009CH    ; 09 HDS0 水平表示開始0
  236.         dw    0031CH    ; 0A HDE0 水平表示終了0
  237.         dw    00088H    ; 0B HDS1 水平表示開始1  default 0009CH
  238.         dw    00330H    ; 0C HDE1 水平表示終了1  default 0031CH
  239.         dw    00036H    ; 0D VDS0 垂直表示開始0
  240.         dw    00368H    ; 0E VDE0 垂直表示終了0
  241.         dw    00028H    ; 0F VDS1 垂直表示開始1  default 00040H
  242.         dw    00370H    ; 10 VDE1 垂直表示終了1  default 00360H
  243.         dw    00000H    ; 11 FA0  フレーム先頭0
  244.         dw    0009CH    ; 12 HAJ0 水平アジャスト0
  245.         dw    00000H    ; 13 FO0  フィールド間オフセット0
  246.         dw    00050H    ; 14 LO0  ライン間オフセット0
  247.         dw    0FA00H    ; 15 FA1  フレーム先頭1  default 00000H
  248.         dw    0009CH    ; 16 HAJ1 水平アジャスト1
  249.         dw    00000H    ; 17 FO1  フィールド間オフセット1
  250.         dw    00080H    ; 18 LO1  ライン間オフセット1
  251.         dw    0004AH    ; 19 EHAJ 外部同期水平ADJ
  252.         dw    00001H    ; 1A EVAJ 外部同期垂直ADJ
  253.         dw    00000H    ; 1B ZOOM 水平垂直拡大
  254.         dw    0801FH    ; 1C CR0  コントロール0
  255.         dw    00003H    ; 1D CR1  コントロール1
  256.         dw    00000H    ; 1E FR   ダミーレジスタ
  257.         dw    00150H    ; 1F CR2  コントロール2
  258.  
  259.     ; CRTC コントロールデータ
  260.     ; その2 31KHz 画面
  261.     ; 背景をほぼ全画面まで広げる
  262. CRT_DATA_2    dw    00060H    ; 00 HSW1 水平同期幅1
  263.         dw    002C0H    ; 01 HSW2 水平同期幅2
  264.         dw    00000H    ; 02 dummy
  265.         dw    00000H    ; 03 dummy
  266.         dw    0031FH    ; 04 HST  水平同期周期
  267.         dw    00000H    ; 05 VST1 垂直同期時間1
  268.         dw    00004H    ; 06 VST2 垂直同期時間2
  269.         dw    00000H    ; 07 EET  等化パルス有効時間
  270.         dw    00419H    ; 08 VST  垂直同期周期
  271.         dw    0008AH    ; 09 HDS0 水平表示開始0
  272.         dw    0030AH    ; 0A HDE0 水平表示終了0
  273.         dw    00070H    ; 0B HDS1 水平表示開始1 default 0008Ah
  274.         dw    00320H    ; 0C HDE1 水平表示終了1 default 0030Ah
  275.         dw    00046H    ; 0D VDS0 垂直表示開始0
  276.         dw    00406H    ; 0E VDE0 垂直表示終了0
  277.         dw    00026H    ; 0F VDS1 垂直表示開始1 default 00046h
  278.         dw    00416H    ; 10 VDE1 垂直表示終了1 default 00406h
  279.         dw    0F4C0H    ; 11 FA0  フレーム先頭0 default 00000h
  280.         dw    0008AH    ; 12 HAJ0 水平アジャスト0
  281.         dw    00000H    ; 13 FO0  フィールド間オフセット0
  282.         dw    00050H    ; 14 LO0  ライン間オフセット0
  283.         dw    0E400H    ; 15 FA1  フレーム先頭1 default 00000h
  284.         dw    0008AH    ; 16 HAJ1 水平アジャスト1
  285.         dw    00000H    ; 17 FO1  フィールド間オフセット1
  286.         dw    00080H    ; 18 LO1  ライン間オフセット1
  287.         dw    00058H    ; 19 EHAJ 外部同期水平ADJ
  288.         dw    00001H    ; 1A EVAJ 外部同期垂直ADJ
  289.         dw    00000H    ; 1B ZOOM 水平垂直拡大
  290.         dw    0801FH    ; 1C CR0  コントロール0
  291.         dw    00002H    ; 1D CR1  コントロール1
  292.         dw    00000H    ; 1E FR   ダミーレジスタ
  293.         dw    00192H    ; 1F CR2  コントロール2
  294.  
  295.     ; パレットデータ
  296.     ; パレット緑(4bit)    B15-B12
  297.     ; パレット赤(4bit)    B11-B08
  298.     ; パレット青(4bit)    B07-B04
  299.     ; パレットコード(4bit)B03-B00
  300.     ; バレットデータ16ビット × 16色分 × 2プレーン
  301. PAL_DATA:
  302. db    'MONO',0
  303.         dw    0FFF0h    ; 黒 → 白(明るい)
  304.         dw    0DDD1h    ; 青        ↓
  305.         dw    0BBB2h    ; 赤        ↓
  306.         dw    09993h    ; マゼンダ  ↓
  307.         dw    07774h    ; 緑 → グレー
  308.         dw    05555h    ; 黄        ↓
  309.         dw    03336h    ; 水        ↓
  310.         dw    01117h    ; 白 → 黒(暗い)
  311.         dw    0FFF8h    ; グレー
  312.         dw    0EEE9h    ; 高赤
  313.         dw    0DDDAh    ; 高青
  314.         dw    0888Bh    ; 高マゼンダ
  315.         dw    0666Ch    ; 高緑
  316.         dw    0222Dh    ; 高黄
  317.         dw    0111Eh    ; 高水
  318.         dw    0000Fh    ; 高白
  319. db    'NEGA',0
  320.         dw    0EEE0h    ; 黒 → 白
  321.         dw    0DD01h    ; 青 → 黄
  322.         dw    0D0D2h    ; 赤 → 水
  323.         dw    0D003h    ; マゼンダ → 緑
  324.         dw    00DD4h    ; 緑 → マゼンダ
  325.         dw    00D05h    ; 水 → 赤
  326.         dw    000D6h    ; 黄 → 青
  327.         dw    01117h    ; 白 → 黒
  328.         dw    0EEE8h    ; グレー
  329.         dw    0DD09h    ; 高赤
  330.         dw    0D0DAh    ; 高青
  331.         dw    0D00Bh    ; 高マゼンダ
  332.         dw    00DDCh    ; 高緑
  333.         dw    00D0Dh    ; 高黄
  334.         dw    000DEh    ; 高水
  335.         dw    0000Fh    ; 高白
  336. db    'PASTEL',0
  337.         dw    06220h    ; 黒 → 緑
  338.         dw    099F1h    ; 赤 → パステル赤
  339.         dw    09F92h    ; 青 → パステル青
  340.         dw    09FF3h    ; マゼンダ →パステルマゼンダ
  341.         dw    0F994h    ; 緑 → パステル緑
  342.         dw    0F9F5h    ; 黄 → パステル黄
  343.         dw    0FF96h    ; 水 → パステル水
  344.         dw    0FFF7h    ; 白 → 白
  345.         dw    08228h    ; グレー
  346.         dw    099F9h    ; 青
  347.         dw    09F9Ah    ; 赤
  348.         dw    09FFBh    ; マゼンダ
  349.         dw    0F99Ch    ; 緑
  350.         dw    0F9FDh    ; 黄
  351.         dw    0FF9Eh    ; 水
  352.         dw    0FFFFh    ; 白
  353. db    'GREEN',0
  354.         dw    01000h    ; 黒    暗い緑
  355.         dw    03001h    ; 青      ↓
  356.         dw    05002h    ; 赤      ↓
  357.         dw    07003h    ; マゼンダ↓
  358.         dw    09004h    ; 緑      ↓
  359.         dw    0B005h    ; 水      ↓
  360.         dw    0D006h    ; 黄      ↓
  361.         dw    0F007h    ; 白    明るい緑
  362.         dw    01008h    ; グレー
  363.         dw    03009h    ; 高赤
  364.         dw    0500Ah    ; 高青
  365.         dw    0700Bh    ; 高マゼンダ
  366.         dw    0900Ch    ; 高緑
  367.         dw    0B00Dh    ; 高黄
  368.         dw    0D00Eh    ; 高水
  369.         dw    0F00Fh    ; 高白
  370. db    'PLASMA',0
  371.         dw    00100h    ; 黒    暗いオレンジ
  372.         dw    01301h    ; 青        ↓
  373.         dw    02502h    ; 赤        ↓
  374.         dw    03703h    ; マゼンダ  ↓
  375.         dw    04904h    ; 緑        ↓
  376.         dw    05B05h    ; 水        ↓
  377.         dw    06D06h    ; 黄        ↓
  378.         dw    07F07h    ; 白    明るいオレンジ
  379.         dw    00108h    ; 黒
  380.         dw    01309h    ; 青
  381.         dw    0250Ah    ; 赤
  382.         dw    0370Bh    ; マゼンダ
  383.         dw    0490Ch    ; 緑
  384.         dw    05B0Dh    ; 水
  385.         dw    06D0Eh    ; 黄
  386.         dw    07F0Fh    ; 白
  387. db    'TROPICAL',0
  388.         dw    02280h    ; 黒 → 青
  389.         dw    040F1h    ; 青 
  390.         dw    02F22h    ; 赤 
  391.         dw    08F63h    ; マゼンダ 
  392.         dw    0F044h    ; 緑 
  393.         dw    0C0F5h    ; 水 
  394.         dw    0CF06h    ; 黄 
  395.         dw    0EEE7h    ; 白 
  396.         dw    02268h    ; 黒 
  397.         dw    040F9h    ; 青 
  398.         dw    02F2Ah    ; 赤 
  399.         dw    08F6Bh    ; マゼンダ 
  400.         dw    0F04Ch    ; 緑 
  401.         dw    0C0FDh    ; 水 
  402.         dw    0CF0Eh    ; 黄 
  403.         dw    0EEEFh    ; 白 
  404. db    'INIT',0
  405.         dw    00000h    ; 黒
  406.         dw    000B1h    ; 青 
  407.         dw    00B02h    ; 赤 
  408.         dw    00BB3h    ; マゼンダ 
  409.         dw    0B004h    ; 緑 
  410.         dw    0B0B5h    ; 水 
  411.         dw    0BB06h    ; 黄 
  412.         dw    0BBB7h    ; 白 
  413.         dw    04448h    ; 黒
  414.         dw    000F9h    ; 高青
  415.         dw    00F0Ah    ; 高赤
  416.         dw    00FFBh    ; 高マゼンダ
  417.         dw    0F00Ch    ; 高緑
  418.         dw    0F0FDh    ; 高水
  419.         dw    0FF0Eh    ; 高黄
  420.         dw    0FFFFh    ; 高白
  421. dw    0            ; エンドオブデータマーク
  422.  
  423.  
  424. _DATA        ends
  425.  
  426. _TEXT        segment    byte public 'CODE'
  427.  
  428. main        proc    near
  429.     ; 
  430.         cld
  431.         jmp    start
  432.  
  433. tune_1        proc
  434.     ; Cxxxx (パレットの数値設定)
  435.     ; の処理(レイア1=文字)
  436.         mov    al,PLT1_SEL
  437.         call    palette_Select
  438. tune:
  439.         inc    [option]
  440.         lodsb
  441.         cmp    al,' '
  442.         jbe    para_loop
  443.     ; パレットコードセット
  444.         call    hex1_to_bin
  445.         mov    dx,plt_cod_reg
  446.         and    al,00001111b
  447.         out    dx,al
  448.     ; 青
  449.         lodsb
  450.         cmp    al,'0'
  451.         jb    para_loop
  452.         call    hex1_to_bin
  453.         call    write_palette2
  454.     ; 赤
  455.         lodsb
  456.         cmp    al,'0'
  457.         jb    para_loop
  458.         call    hex1_to_bin
  459.         call    write_palette2
  460.     ; 緑
  461.         lodsb
  462.         cmp    al,'0'
  463.         jb    para_loop
  464.         call    hex1_to_bin
  465.         call    write_palette2
  466.         jmp short skip_blank
  467. tune_1        endp
  468.  
  469. tune_0        proc
  470.     ; cxxxx (パレットの数値設定)
  471.     ; の処理(レイア0=グラフィック)
  472.         call    palette_select0
  473.         jmp    tune
  474. tune_0        endp
  475.  
  476. limit_line    proc
  477.     ; 画面の上と下に線を
  478.     ; 引く(L1)/消す(L0)
  479.         inc    [option]
  480.         lodsb
  481.         cmp    al,'1'
  482.         je    line1
  483.         cmp    al,'0'
  484.         jne    para_loop
  485.         call    reset_line
  486.         jmp short skip_blank
  487. line1:
  488.         call    set_line
  489.         jmp short skip_blank
  490. limit_line    endp
  491.  
  492. display_mode    proc
  493.  
  494.         inc    [option]
  495.         lodsb
  496.         mov    bx,1
  497.         cmp    al,'L'
  498.         je    set_d
  499.         dec    bx
  500.         dec    bx
  501.         cmp    al,'-'
  502.         je    set_d
  503.         mov    bx,offset CGROUP:crt_data_0
  504.         sub    al,'0'
  505.         je    set_d
  506.         mov    bx,offset CGROUP:crt_data_1
  507.         dec    ax
  508.         je    set_d
  509.         mov    bx,offset CGROUP:crt_data_2
  510.         dec    ax
  511.         jne    para_loop
  512. set_d:
  513.         mov    [doption],bx
  514.         jmp short skip_blank
  515.  
  516. display_mode    endp
  517. START:
  518.     ; 初期メッセージ
  519.     ; テストパタン表示
  520.         mov    dx,offset cgroup:c_mes
  521.         mov    ah,009h
  522.         int    021h
  523.     ; パラメータ解析
  524.         mov    si,00081h
  525. skip_blank:
  526.         lodsb
  527. para_loop:
  528.         xor    ah,ah
  529.         cmp    al,cr
  530.         je    normal_end
  531.         cmp    al,' '
  532.         jbe    skip_blank
  533.     ; パレット数値設定
  534.         cmp    al,'c'
  535.         je    tune_0
  536.         cmp    al,'C'
  537.         jne    para_d
  538.         jmp    tune_1
  539. para_d:
  540.     ; 画面モード設定
  541.         cmp    al,'D'
  542.         je    display_mode
  543.     ; 画面境界線の描画
  544.         cmp    al,'L'
  545.         je    limit_line
  546.     ; 色セット名による設定
  547.         mov    dx,offset cgroup:work_buff
  548.         mov    di,dx
  549. mov_str:
  550.         stosb
  551.         lodsb
  552.         cmp    al,' '
  553.         ja    mov_str
  554.         xor    ax,ax
  555.         stosb
  556.     ; si 保存
  557.         dec    si
  558.         mov    bp,si
  559.         mov    bx,offset cgroup:PAL_DATA
  560.         mov    si,bx
  561. next_set:
  562.     ; パレットセット表の終端?
  563.         mov    di,dx
  564.         cmp    byte ptr[si],0    
  565.         je    print_help
  566. match_key:
  567.         lodsb
  568.         scasb
  569.         jne    unmatch_1
  570.     ; 0 ならマッチング
  571.         cmp    al,0
  572.         jne    match_key
  573.  
  574.         inc    [option]
  575.     ; パレットのセット実行
  576.     ; レイア 1(文字)セレクト
  577.         mov    al,PLT1_SEL
  578.         call    palette_select
  579.         mov    cx,16
  580.         push    si
  581.         push    cx
  582. loop_label:
  583.         lodsw
  584.         call    palette_Set
  585.         loop    loop_label
  586.  
  587.     ;  レイア 0(グラフィック)セレクト
  588.         mov    al,PLT0_SEL
  589.         call    palette_select
  590.         pop    cx
  591.         pop    si
  592. loop_label2:
  593.         lodsw
  594.         call    palette_Set
  595.         loop    loop_label2
  596.     ; レイア0,レイア1ともに表示
  597.         mov    al,00fh
  598.         MOV    dx,0fda0h
  599.         out    dx,al
  600.     ; si 復帰
  601.         mov    si,bp
  602.         jmp    skip_blank
  603. normal_end:
  604.         cmp    [option],0
  605.         je    print_help
  606.         cmp    [Doption],0
  607.         jne    crtc_set
  608.     ; 白Towns = D2
  609.         mov    si,offset cgroup:crt_data_2
  610.     ; 白いTownsかグレーTownsか
  611.     ; A24桁上がりの有無で判定する
  612.         in    al,0024h
  613.         and    al,000000100b
  614.         je    crtc_set_default
  615.     ; グレーTowns = D1
  616.         mov    si,offset cgroup:crt_data_1
  617.         jmp short crtc_set_default
  618. crtc_set:
  619.         cmp    [Doption],-1
  620.         je    no_crt_set
  621.         cmp    [Doption],1
  622.         je    lcon_only
  623.     ; CRTC に値を設定
  624.         mov    si,[Doption]
  625. crtc_set_default:
  626.         call    crtc_data_set
  627. no_crt_set:
  628.         call    palette_select0
  629.     ; 終了 system_call
  630.     ; リタンコード 0
  631.         mov    ax,04c00h
  632.         int    021h
  633.     ; 
  634. skip_keyword:
  635.         lodsb
  636. unmatch_1:
  637.         cmp    al,0
  638.         jne    skip_keyword
  639.         add    si,16*2
  640.         jmp    next_set
  641.  
  642. main        endp
  643.  
  644. print_help    proc
  645.     ; ヘルプメッセージ表示
  646.         mov    dx,offset cgroup:help_mes
  647.         mov    ah,009h
  648.         int    021h
  649.     ; 終了 system_call
  650.     ; リタンコード 1
  651.         mov    ax,04c01h
  652.         int    021h
  653. print_help    endp
  654.  
  655. lcon_only    proc
  656.     ; LCON.COM (マシーンMさん作)
  657.     ; の対応
  658.     ; 画面左のみ背景を広げる
  659.         mov    al,00bh
  660.         mov    bx,0007Ah    ; 8a
  661.         call    crtc_data_set1
  662.         jmp    no_crt_set
  663. lcon_only    endp
  664.  
  665. palette_select0 proc
  666.     ; レイア0 のセレクト
  667.         mov    al,PLT0_SEL
  668. palette_select    proc
  669.     ; レイア0/1のセレクト
  670.         push    ax
  671.         mov    dx,V_IO_AD_REG
  672.         mov    al,PRIO_REG
  673.         out    dx,al
  674.         inc    dx
  675.         inc    dx
  676.         pop    ax
  677.         out    dx,al
  678.         ret
  679. palette_select    endp
  680. palette_select0    endp
  681.  
  682. palette_Set    proc
  683.     ; アナログパレットを
  684.     ; 設定する。
  685.     ; in AX
  686.     ;    AL b0-b3 パレットコード
  687.     ;    AL b7-b4 青パレット
  688.     ;    AH b0-b3 赤パレット
  689.     ;    AH b7-b4 緑パレット
  690.     ;out なし
  691.     ;    AX こわれます
  692.     ;    DX こわれます
  693.     ;    AX,DX以外のレジスタは保存。
  694.         push    ax
  695.     ; パレットコード設定
  696.         mov    dx,plt_cod_reg
  697.         and    al,00001111b
  698.         out    dx,al
  699.     ; 青パレット設定
  700.         pop    ax
  701.         call    write_palette
  702.     ; 赤パレット設定
  703.         push    ax
  704.         ror    ax,4
  705.         call    write_palette
  706.     ; 緑パレット設定
  707.         pop    ax
  708.         mov    al,ah
  709. write_palette:
  710.         inc    dx
  711.         inc    dx
  712.         and    al,11110000b
  713.         out    dx,al
  714.         ret
  715. write_palette2:
  716.         rol    ax,4
  717.         jmp    write_palette
  718. palette_Set    endp
  719.  
  720. crtc_data_set    proc
  721.     ;    CRTC操作
  722.     ; in SI CRTSレジスタセットテーブル
  723.         xor    ax,ax
  724. crtc_data_set_loop:
  725.         push    ax
  726.         lodsw
  727.         mov    bx,ax
  728.         pop    ax
  729.         call crtc_data_set1
  730.         inc    ax
  731.         cmp    al,020H
  732.         jb    crtc_data_set_loop
  733.         ret
  734.  
  735.     ; in AL CRTC レジスタ番号
  736.     ;    BX そのレビジスタにセットする値
  737. crtc_data_set1:
  738.         push    ax
  739.         mov    dx,CRTC_ADR_REG
  740.         out    dx,al
  741.         mov    dx,CRTC_DAT_REG
  742.         mov    ax,bx
  743.         out    dx,ax
  744.         pop    ax
  745.         ret
  746. crtc_data_set    endp
  747.  
  748. set_line    proc
  749.     ; DOS画面の
  750.     ; 上と下に線を引く
  751.         push    es
  752.         call    set_line_reg
  753.         mov    ax,1010101010101010b
  754.         call    set_line_sub
  755.         mov    ax,0101010101010101b
  756. set_line_ent:
  757.         mov    di,80 * 408
  758.         call    set_line_sub
  759.         pop    es
  760.         ret
  761. set_line_sub:
  762.           mov    cx,40
  763.     rep    stosw
  764.         ret
  765. set_line    endp
  766.  
  767. set_line_reg    proc
  768.         mov    al,07h
  769.         mov    dx,0FF81h
  770.         out    dx,al
  771.  
  772.         mov    ax,0c000h
  773.         mov    es,ax
  774.         mov    di,80 * 0
  775.         ret
  776. set_line_reg    endp
  777.  
  778. reset_line    proc
  779.     ; DOS画面の
  780.     ; 上と下の線を消す
  781.         push    es
  782.         call    set_line_reg
  783.         mov    ax,0000000000000000b
  784.         call    set_line_sub
  785.         jmp    set_line_ent
  786. reset_line    endp
  787.  
  788. hex1_to_bin    proc
  789.     ; 16進文字1文字を
  790.     ; 2進にする
  791.     ; Input
  792.     ;     al : 文字
  793.     ; Output
  794.     ;     al : 数字
  795.     ;       規定外の文字が入力される
  796.     ;    と 0になる。
  797.     ;    エラー処理は行わない。
  798.  
  799.         cmp    al,'0'
  800.         jb    error_hook
  801.         cmp    al,'9'
  802.         jbe    number
  803.         cmp    al,'A'
  804.         jb    error_hook
  805.         cmp    al,'F'
  806.         jbe    capital
  807.         cmp    al,'a'
  808.         jb    error_hook
  809.         cmp    AL,'f'
  810.         ja    error_hook
  811. ;SMALL:
  812.         sub    al,'a'-'A'
  813. capital:
  814.         sub    al,'A'-'0'-10
  815. number:
  816.         sub    al,'0'
  817.         ret
  818. error_hook:
  819.         xor    al,al
  820.         ret
  821. hex1_to_bin    endp
  822.  
  823. _TEXT        ends
  824.  
  825.         end    main
  826.